#include "AVDeMuxer.h"
#include <QDebug>
extern "C"
{
#include <libavformat/avformat.h>
}
using AVPacketPtr = std::shared_ptr<AVPacket>;
using AVFramePtr =std::shared_ptr<AVFrame>;//别名

AVDeMuxer::AVDeMuxer()
    :quit_(false)//初始化
{
    //创建解封装上下文
    pFormatCtx_ =avformat_alloc_context();
    //设置参数
    pFormatCtx_->max_ts_probe=50;
    pFormatCtx_->interrupt_callback.callback = InterruptFountion;//通过这个回调函数去停止拉流
    pFormatCtx_->interrupt_callback.opaque = this;
    //加速拉流
    pFormatCtx_->flags |=AVFMT_FLAG_DISCARD_CORRUPT;
}

bool AVDeMuxer::Open(const QString path){
    //打开流地址rtsp rtmp .... hls webrtc rtmp://ip:port/live/streamname
    //启动线程
    readThread_.reset(new std::thread([this,path](){
        this->FetchStream(path);
    }));//[](){}匿名函数
    return true;

}

void AVDeMuxer::Close()
{
    //将标志位置位true;
    quit_ = true;
    //释放资源
    if(readThread_)
    {
        readThread_.reset();
        readThread_ = nullptr;
    }
    //封装格式上下文释放资源
    if(pFormatCtx_)
    {
        avformat_free_context(pFormatCtx_);
    }

}

void AVDeMuxer::FetchStream(const QString path)
{
    //获取流信息
    bool ret = true;
    if(streamCb_)
    {
        ret = FetchStreamInfo(path);
        streamCb_(ret);
    }
    if(!ret)
    {
        return;
    }
    //创建一个packet,来接收编码数据
    AVPacketPtr packet = nullptr;
    while (!quit_ && pFormatCtx_){
        packet = AVPacketPtr(av_packet_alloc(),[](AVPacket* p){av_packet_free(&p);});
        //开始读取数据
        int re = av_read_frame(pFormatCtx_,packet.get());
        if(re == 0){
            if(packet->stream_index == videoIndex)
            {
                //视频包数据
                //开始解码音视频数据包
                qDebug() << "视频包";

            }
            else if(packet->stream_index == AudioIndex)
            {
                //音频包数据
                qDebug() << "音频包";

            }
        }
        else
        {
            av_packet_unref(packet.get());
            break;
        }
    }
}

bool AVDeMuxer::FetchStreamInfo(const QString path)
{
    //获取流信息
    if(avformat_open_input(&pFormatCtx_,path.toStdString().c_str(),nullptr,nullptr)!=0)
    {
        //
        qDebug() << "avformat_open_input failed" << path;
        return false;
    }
    //查询流信息
    if(avformat_find_stream_info(pFormatCtx_,nullptr)<0)
    {
        qDebug() << "avformat_find_stream_info failed";
        return false;
    }
    //遍历流信息
    for(int i = 0;i<pFormatCtx_->nb_streams;i++)
    {
        if(pFormatCtx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
        {
            //更新视频索引
            videoIndex = i;
        }
        else if(pFormatCtx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
        {
            //更新音频索引
            AudioIndex=i;
        }
        else
        {
            continue;
        }
    }
    if(videoIndex != -1)
    {
        //当前没有视频
        //初始化视频解码器
        qDebug() << "含有视频流";
    }
    if(AudioIndex != -1)
    {
        //当前没有音频
        // return false;//初始化音频解码器
        qDebug() << "含有音频流";

    }
    return true;

}

int AVDeMuxer::InterruptFountion(void *arg)
{
    AVDeMuxer* thiz = (AVDeMuxer*)arg;
    return thiz->quit_;//0运行 1停止
}
